package random

import (
	"math/rand"
	"strings"
	"time"
)

func init() {
	rand.Seed(time.Now().Unix())
}

// Capitalize 把字符串的第一个字母转换为大写。
func Capitalize(word string) string {
	return strings.ToUpper(word[0:1]) + word[1:]
}

// Pick 从数组中随机选取一个元素，并返回。
func Pick[T any](arr []T, min, max int) T {
	if min <= 1 && max <= 1 {
		return arr[Natural(0, len(arr)-1)]
	}
	return ShuffleOf(arr, min, max)
}

// ShuffleOf 从数组中随机选取一个元素，并返回。
func ShuffleOf[T any](arr []T, min, max int) T {
	result := Shuffle(arr)
	ll := Natural(min, max)
	if ll >= len(result) {
		return result[len(result)-1]
	}
	return result[ll]
}

// ShuffleArr 打乱数组中元素的顺序，并取随机长度数组。
func ShuffleArr[T any](arr []T, min, max int) []T {
	result := Shuffle(arr)
	ll := Natural(min, max)
	if ll >= len(result) {
		return result
	}
	return result[0:Natural(min, max)]
}

// Shuffle 打乱数组中元素的顺序，并返回。
func Shuffle[T any](arr []T) []T {
	var (
		result    []T
		old       = arr[:]
		length    = len(old)
		newLength = len(old)
	)

	for i := 0; i < length; i++ {
		index := Natural(0, newLength-1)
		result = append(result, old[index])
		if index != newLength-1 {
			old[index] = old[newLength-1]
		}
		newLength--
	}
	return result
}
